#ifndef CONFIG_PW_PBL_TLSF_HPP
#define CONFIG_PW_PBL_TLSF_HPP

#include <cstdint>

namespace pw_pbl::TLSF::config
{
	/// 管理器默认参数结构类，复制并修改值后传入模板以实现自定义
	struct TDefaultParms
	{
		using THeaderCell = intptr_t;							  /// 块头基本存储单元类型，须可强制转换为相等大小的整形，应满足sizeof(THeaderCell) <= sizeof(nullptr)
		static constexpr auto ESizeMultiple = 1;				  /// 实际基本分配单元大小和对齐是块头基本存储单元大小的倍数，需是2的幂
		static constexpr auto ELinkPtrSize = sizeof(THeaderCell); /// 空闲队列链接指针大小（字节），应满足ELinkPtrSize <= sizeof(THeaderCell) * ESizeMultiple && ELinkPtrSize <= sizeof(nullptr)
		static constexpr auto EMaxMemorySliceSize = 128 * 1024;	  /// 最大内存分片大小（字节），根据此值自动计算第一级映射个数，当添加的内存块超过此大小时也会自动按此上限分片，用户可分配的最大内存块比此值略小
		static constexpr auto ESlCnt = 8;						  /// 第二级映射个数，应是2的幂，值越小额外占用的固定内存越少，但是分配时块大小匹配度越差

		alignas(sizeof(THeaderCell) * ESizeMultiple) static THeaderCell pool[]; /// （非配置要求的，仅示例）ELinkPtrSize < sizeof(nullptr)时的RAM存储区，注意对齐要求

		/// ELinkPtrSize < sizeof(nullptr)时，指示基准地址
		static consteval THeaderCell *pBase() { return pool; }
		/// ELinkPtrSize < sizeof(nullptr)时，上面pBase指针指向的地址是否确保已按sizeof(THeaderCell) * ESizeMultiple对齐
		static constexpr auto EpBaseAligned = true;

		using TMonitor = void; /// 存储池监控器类型，为void表示不监控，否则存储池类将继承自此类

		/// 存储池线程同步锁接口，为void无同步，存储池只能单线程执行
		/// @note 当多线程使用且std::mutex可用时，可直接using TMutex = std::mutex;
		using TMutex = void;
	};
} // namespace pw_pbl::TLSF::config

#endif // CONFIG_PW_PBL_TLSF_HPP
